package KNN;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import typydanych.Wektor;

public class KNNListaNajblizszychSasiadow {

	private LinkedList<MetrykaWektora> listaElementow;
	private int aktualnyRozmiar;
	private int maksymalnyRozmiar;

	public KNNListaNajblizszychSasiadow(int maksymalnyRozmiar) {
		super();
		listaElementow = new LinkedList<MetrykaWektora>();
		this.maksymalnyRozmiar = maksymalnyRozmiar;
		this.aktualnyRozmiar = 0;
	}

	public int rozmiar() {
		return aktualnyRozmiar;
	}

	public void dodaj(MetrykaWektora nowyElement) {

		if (aktualnyRozmiar == maksymalnyRozmiar) {
			MetrykaWektora ogon = listaElementow.getLast();
			if (nowyElement.getMetryka() < ogon.getMetryka()) {
				// znajdz miejsce dla nowego
				Iterator iterator = listaElementow.iterator();
				int i = -1;
				while (iterator.hasNext()) {
					i++;
					MetrykaWektora element = (MetrykaWektora) iterator.next();
					if (nowyElement.getMetryka() < element.getMetryka()) {
						if (i == 0) { // glowa listy
							listaElementow.addFirst(nowyElement);
							break;
						} else {
							listaElementow.add(i - 1, nowyElement);
							break;
						}
					}
				}
				// usun ostatni z listy
				listaElementow.removeLast();
			}
		} else {
			listaElementow.add(nowyElement);
			aktualnyRozmiar++;
			if (aktualnyRozmiar == maksymalnyRozmiar) {
				Collections.sort(listaElementow);
			}
		}
	}

	public Wektor[] kolekcja() {
		Wektor[] kolekcjaWektorow = new Wektor[maksymalnyRozmiar];
		Iterator iterator = listaElementow.iterator();
		int i = -1;

		while (iterator.hasNext()) {
			i++;
			MetrykaWektora element = (MetrykaWektora) iterator.next();
			kolekcjaWektorow[i] = element.getWektor();
		}

		return kolekcjaWektorow;
	}
	
	public void wyczysc(){
		aktualnyRozmiar = 0;
		listaElementow.clear();
	}
	
	public void pokaz(){
		Iterator iterator = listaElementow.iterator();

		while (iterator.hasNext()) {
			MetrykaWektora element = (MetrykaWektora) iterator.next();
			System.out.println(element);;
		}
	}

}
